package com.dongzili.query.common.config.redis;

import io.lettuce.core.AbstractRedisClient;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.*;

public class RedisOperationsUtil {

    public static <T> RedisTemplate<String, T> getTemplate(){
        return RedisTemplateConfig.getRedisTemplate();
    }

    public AbstractRedisClient getRedisClient() {
        RedisConnectionFactory connectionFactory = getTemplate().getConnectionFactory();
        if (connectionFactory instanceof LettuceConnectionFactory) {
            LettuceConnectionFactory lettuceConnectionFactory = (LettuceConnectionFactory) connectionFactory;
            return lettuceConnectionFactory.getNativeClient();
        } else {
            throw new UnsupportedOperationException("This example only works with LettuceConnectionFactory.");
        }
    }

    /**
     * hash操作<BR/>
     <BR/>
     * 高效存储对象属性<BR/>
     * 减少内存消耗：通过将对象的多个属性存储在一个Hash中，可以有效地减少内存消耗，因为相关的数据被紧凑地存储在一起。<BR/>
     * 快速访问：由于Hash内部实现了哈希表，因此可以快速地通过字段名访问到对应的值，而不需要遍历整个数据结构。<BR/>
     <BR/>
     * 实现复杂类型数据存储<BR/>
     * 嵌套数据结构：Redis Hash支持在Hash内部嵌套其他数据结构，如List、Set等，这使得它可以用于存储复杂的类型数据。<BR/>
     * 动态扩展：Hash可以根据需要动态地添加或删除字段，这为数据结构的扩展提供了灵活性。<BR/>
     <BR/>
     * 支持多种操作命令<BR/>
     * 基本操作：Redis提供了HSET、HGET、HMSET、HMGET等基本操作命令，允许用户对Hash中的字段进行设置和获取。<BR/>
     * 高级操作：除了基本操作外，Redis还提供了如HINCRBY、HKEYS、HSCAN等高级操作命令，这些命令使得对Hash的操作更加灵活和强大。<BR/>
     <BR/>
     * 应用场景广泛<BR/>
     * 用户信息存储：在社交网络、电子商务平台等应用中，用户的个人信息通常以Hash的形式存储，便于快速查找和更新。<BR/>
     * 配置管理：Hash可以用来存储应用的配置信息，如数据库连接信息、API密钥等，这些信息可以通过Hash方便地进行管理和访问。<BR/>
     */
    public static <T> HashOperations<String, String, T> getHashOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForHash();
    }

    /**
     * zset操作<BR/>
     * <BR/>有序集合 它在set的基础上增加了一个score参数，用于对集合中的元素进行从小到大的排序.
     * <BR/>以下是关于Redis ZSet作用的具体分析：
     <BR/>
     * <BR/>实现排行榜
     * <BR/>功能描述：ZSet非常适合用于实现各种排行榜，例如网站的文章排行、学生成绩排行等。通过将用户的ID作为元素，用户的分数作为score，可以轻松地获取到分数最高的用户或者任何用户的排名。
     * <BR/>应用场景：在社交媒体平台中，可以使用ZSet来实现用户的关注数排行榜；在电商平台中，可以实现商品的销量排行榜等。
     <BR/>
     * <BR/>实现时间线
     * <BR/>功能描述：ZSet可以用于实现时间线功能。例如，将发布的消息作为元素，消息的发布时间作为score，然后使用ZSet来存储和排序所有的消息。这样可以很容易地获取到最新的消息，或者获取到任何时间段内的消息。
     * <BR/>应用场景：在新闻网站中，可以使用ZSet来实现新闻的时间线；在博客系统中，可以实现文章的发布时间线等。
     <BR/>
     * <BR/>实现带权重的队列
     * <BR/>功能描述：ZSet可以用于实现带权重的队列。例如，将任务作为元素，任务的优先级作为score，然后使用ZSet来存储和排序所有的任务。这样可以很容易地获取到优先级最高的任务，或者按优先级顺序执行任务。
     * <BR/>应用场景：在任务调度系统中，可以使用ZSet来实现任务的优先级队列；在电商平台中，可以实现商品的推荐队列等。
     <BR/>
     * <BR/>实现延时队列
     * <BR/>功能描述：ZSet可以用于实现延时队列。例如，将需要延时处理的任务作为元素，任务的执行时间作为score，然后使用ZSet来存储和排序所有的任务。定期扫描ZSet，处理已经到达执行时间的任务。
     * <BR/>应用场景：在消息队列系统中，可以使用ZSet来实现消息的延时处理；在电商平台中，可以实现订单的延时发货等。
     <BR/>
     * <BR/>实现统计和计数
     * <BR/>功能描述：ZSet可以用于实现统计和计数功能。例如，统计某个时间段内的用户活跃度，或者统计某个商品被浏览的次数等。
     * <BR/>应用场景：在数据分析系统中，可以使用ZSet来实现数据的统计和计数；在监控系统中，可以实现系统性能指标的统计和计数等。

     * <BR/>实现交集、并集和差集运算
     * <BR/>功能描述：ZSet支持求差集、交集、并集运算，这使得它非常适合用于实现复杂的数据聚合操作。
     * <BR/>应用场景：在数据分析系统中，可以使用ZSet来实现数据的聚合和分析；在推荐系统中，可以实现用户兴趣的聚合和分析等。
     */
    public static <T> ZSetOperations<String, T> getZSetOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForZSet();
    }

    /**
     * <BR/>set操作
     * <BR/>set是一种无序且元素唯一的集合数据结构，它支持添加、查询、删除元素以及计算交集、并集、差集等操作。
     <BR/>
     <BR/>基本用法
     <BR/>添加元素：可以使用SADD命令向集合中添加一个或多个元素。
     <BR/>查询元素：使用SMEMBERS命令可以查看集合中的所有元素。
     <BR/>删除元素：SREM命令用于从集合中删除指定的元素。
     <BR/>
     <BR/>高级特性
     <BR/>设置过期时间：可以为集合中的元素设置过期时间，当时间到达后，元素会自动被删除。
     <BR/>唯一性保证：集合中的元素是唯一的，即使尝试添加重复的元素，也不会影响原有的元素。
     <BR/>无序性：集合中的元素是无序的，这意味着不能通过索引来访问特定的元素。
     <BR/>集合运算：支持取交集（SINTER）、并集（SUNION）和差集（SDIFF）等集合运算，这在进行数据分析和处理时非常有用。
     <BR/>
     <BR/>应用场景
     <BR/>标签系统：在内容平台上，用户给文章打上不同的标签，系统需要根据标签过滤和推荐文章。
     <BR/>社交网络好友关系：表示用户的好友列表，支持快速好友关系测试和好友推荐。
     <BR/>实时在线状态：将在线用户ID存储在Redis set中，并利用其过期时间特性，可以实现实时在线状态的判断。
     <BR/>缓存：将经常使用的数据缓存在Redis中，以减轻数据库的负担，提高访问速度。
     <BR/>地理位置定位：利用Redis的GEO命令和有序集合ZSET结合起来实现地理位置定位功能，可以根据经纬度查询附近的人或者商家等信息。
     <BR/>排行榜：利用Redis的有序集合ZSET实现排行榜功能，可以根据分值排序或者按照插入顺序排序。
     *
     */
    public static <T> SetOperations<String, T> getSetOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForSet();
    }

    /**
     * <BR/>list操作
     * <BR/>List是一种有序的字符串集合，支持在两端进行高效的插入和删除操作。
     <BR/>
     <BR/>实现队列
     <BR/>先进先出：通过RPUSH命令将元素插入列表尾部，使用LPOP命令从列表头部移除元素，可以实现先进先出的队列。
     <BR/>应用场景：适用于任务调度、消息队列等场景，确保任务按照到达顺序执行。
     <BR/>
     <BR/>实现栈
     <BR/>先进后出：通过LPUSH命令将元素插入列表头部，使用LPOP命令从列表头部移除元素，可以实现先进后出的栈。
     <BR/>应用场景：适用于算法中的回溯问题、深度优先搜索等需要后进先出数据结构的场景。
     <BR/>
     <BR/>存储实时在线用户列表
     <BR/>实时更新：可以通过LPUSH和RPUSH命令实时添加用户ID，LPOP和RPOP命令实时移除用户ID，实现实时在线用户的动态管理。
     <BR/>应用场景：适用于社交网络、在线游戏等需要实时跟踪用户状态的应用。
     <BR/>
     <BR/>日志记录
     <BR/>按时间顺序存储：可以使用LPUSH或RPUSH命令将日志信息按时间顺序存储在列表中，LRANGE命令可以获取指定时间段内的日志记录。
     <BR/>应用场景：适用于系统监控、应用审计等需要记录和查询日志信息的场景。
     <BR/>
     <BR/>关注列表
     <BR/>动态更新：可以通过LPUSH和RPUSH命令动态添加和移除关注对象，LRANGE命令可以获取当前关注列表。
     <BR/>应用场景：适用于社交媒体、内容平台等需要管理用户关注列表的场景。
     <BR/>
     <BR/>最新消息列表
     <BR/>实时更新：可以通过LPUSH命令将最新消息插入列表头部，RPOP命令可以获取并移除最早的消息，实现最新消息的实时更新。
     <BR/>应用场景：适用于新闻网站、博客等需要展示最新消息列表的场景。
     <BR/>
     <BR/>留言列表
     <BR/>按时间顺序存储：可以通过LPUSH命令将留言按时间顺序存储在列表中，LRANGE命令可以获取指定时间段内的留言记录。
     <BR/>应用场景：适用于论坛、评论区等需要按时间顺序展示留言的场景。
     */
    public static <T> ListOperations<String, T> getListOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForList();
    }

    /**
     * <BR/>value操作
     * <BR/>Value作用在于存储数据，支持多种类型并实现快速访问与操作。具体来说，Redis的Value具有以下作用：
     <BR/>
     * <BR/>存储用户会话信息：通过将用户的会话信息存储在Redis中，可以实现快速的用户认证和状态保持。
     <BR/>
     * <BR/>缓存热点数据：将经常访问的数据存储在Redis中，可以减轻后端数据库的压力，提高数据检索速度。
     <BR/>
     * <BR/>消息队列系统：利用Redis的列表或发布/订阅功能，可以实现消息的异步处理和系统的解耦。
     <BR/>
     * <BR/>排行榜系统：使用有序集合（ZSet）存储用户分数，可以方便地获取用户的排名信息。
     <BR/>
     * <BR/>社交网络关系：通过集合（Set）存储用户之间的关系，如好友列表、关注列表等。
     <BR/>
     * <BR/>实时统计系统：利用Redis的原子操作，可以实现对网站访问量、用户在线数等指标的实时统计。
     */
    public static <T> ValueOperations<String, T> getValueOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForValue();
    }

    /**
     * <BR/>stream操作
     * <BR/>Redis Stream 是一种用于处理实时消息流的数据结构，自Redis 5.0版本引入。以下是关于Redis Stream作用的具体分析：
     <BR/>
     * <BR/>实时消息队列
     * <BR/>消息传递：Redis Stream提供了一种有序、可持久化的消息队列，支持消息的添加、读取和删除操作。
     * <BR/>消费者组：通过消费者组，允许多个消费者并行处理消息，实现负载均衡和高可用性。
     * <BR/>消息确认：消费者处理完消息后，可以通过XACK命令确认消息已被处理，确保消息不会丢失。
     <BR/>
     * <BR/>日志系统
     * <BR/>事件记录：Redis Stream可以用作日志收集系统的一部分，实时接收和处理日志数据。
     * <BR/>事件溯源：在金融、物联网等领域，事件溯源是关键需求。Redis Stream可以记录所有事件，支持按时间顺序回放。
     <BR/>
     * <BR/>消息队列
     * <BR/>任务调度：通过消费者组，Redis Stream可以实现高性能的消息队列，适用于实时数据处理、任务调度等场景。
     * <BR/>延迟处理：支持将消息设置为延迟处理，直到指定的时间点才被消费，适用于需要定时执行的任务。
     <BR/>
     * <BR/>实时监控
     * <BR/>系统监控：利用Redis Stream的持久化特性，可以实时监控系统的状态变化，并记录到Stream中。
     * <BR/>报警通知：当系统状态发生异常时，可以通过Stream发送报警信息给相关的监控系统或运维人员。
     <BR/>
     * <BR/>数据同步
     * <BR/>跨数据中心复制：Redis Stream支持跨数据中心的消息复制，确保数据的一致性和可靠性。
     * <BR/>分布式系统协调：在分布式系统中，可以使用Stream来协调各个节点之间的操作，保证系统的协同工作。
     <BR/>
     * <BR/>实时分析
     * <BR/>数据流处理：Redis Stream可以与数据分析工具结合使用，实时处理和分析数据流。
     * <BR/>复杂查询：支持对Stream中的数据进行复杂的查询操作，如范围查询、反向查询等。
     */
    public static <K,T> StreamOperations<String, K, T> getStreamOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForStream();
    }

    /**
     * <BR/>geo操作
     * <BR/>Redis 的 GEO（Geospatial）功能主要用于处理和存储地理位置数据，并在这些数据上执行各种操作。以下是 GEO 功能的主要作用：
     <BR/>
     * <BR/>地理位置数据存储：允许用户将地理位置数据以经纬度的形式存储在 Redis 中。每个地理位置点都关联一个唯一的键，方便进行查询和管理。
     <BR/>
     * <BR/>地理位置查询：提供了多种查询方式，包括获取指定位置点的经纬度、计算两个位置点之间的距离、查找指定范围内的位置点以及根据位置点进行排序等。
     <BR/>
     * <BR/>实时性要求高的应用：由于 Redis 是内存数据库，其查询速度非常快，特别适合对查询性能要求高的应用场景，如外卖配送、社交媒体、地图服务等。
     <BR/>
     * <BR/>总的来说，Redis 的 GEO 功能为开发者提供了一个强大的工具箱，使得在应用程序中轻松集成地理位置相关的特性成为可能。
     */
    public static <T> GeoOperations<String, T> getGeoOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForGeo();
    }

    /**
     * <BR/>cluster操作
     * <BR/>Redis ClusterOperations的作用在于提供一套完整的命令和操作，用于管理和维护Redis集群的运行状态。以下是对Redis ClusterOperations作用的详细分析：
     <BR/>
     * <BR/>节点管理
     * <BR/>添加节点：通过CLUSTER MEET命令，可以向集群中添加新的节点。这有助于扩展集群的容量和处理能力。
     * <BR/>移除节点：使用CLUSTER FORGET命令，可以从集群中移除指定的节点。这在节点故障或维护时非常有用。
     * <BR/>查看节点信息：CLUSTER NODES命令提供了集群中所有节点的详细信息，包括节点ID、地址、角色等。
     <BR/>
     * <BR/>数据管理
     * <BR/>数据分布：Redis Cluster通过哈希槽将数据分布在不同的节点上，每个节点负责一部分槽位的数据。这样可以有效地分散存储压力，提高数据的可用性和访问速度。
     * <BR/>数据迁移：当集群中的节点发生变化时，如添加或删除节点，需要进行数据的迁移以重新平衡数据分布。
     <BR/>
     * <BR/>故障恢复
     * <BR/>自动故障转移：Redis Cluster支持自动故障转移，当主节点发生故障时，系统会自动将一个从节点提升为新的主节点。这保证了服务的高可用性。
     * <BR/>手动故障转移：在某些情况下，可能需要手动执行故障转移。例如，使用CLUSTER FAILOVER命令可以将指定的从节点提升为主节点。
     <BR/>
     * <BR/>监控与维护
     * <BR/>集群监控：CLUSTER INFO命令提供了集群的详细运行状态，包括各个节点的信息、槽位分配情况等。这对于集群的监控和维护非常重要。
     * <BR/>维护模式：CLUSTER MAINTENANCE命令可以将集群设置为维护模式，暂停客户端请求的处理，以便进行维护操作。
     * <BR/>总的来说，Redis ClusterOperations提供了一套强大的工具和命令，用于管理和操作Redis集群。这些操作涵盖了从节点管理到数据管理、故障恢复以及监控与维护等多个方面，确保了Redis集群的高可用性、可扩展性和易管理性。
     */
    public static <T> ClusterOperations<String, T> getClusterOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForCluster();
    }

    /**
     * <BR/>hyperloglog操作
     * <BR/>HyperLogLogOperations 是 Spring Data Redis 提供的一个接口，用于操作 Redis 中的 HyperLogLog 数据结构。HyperLogLog 是一种概率性的数据结构，用于估算集合中不同元素的数量（基数），它使用非常少的内存来存储大量数据，并且可以提供相对精确的估计值。
     <BR/>
     * <BR/>以下是 HyperLogLogOperations 的一些主要作用和功能：
     <BR/>
     * <BR/>添加元素: 可以将一个或多个元素添加到 HyperLogLog 中。
     * <BR/>合并 HyperLogLog: 可以将多个 HyperLogLog 合并成一个，以获得更精确的基数估计。
     * <BR/>获取基数估计: 可以获取当前 HyperLogLog 中不同元素的近似数量。
     * <BR/>删除 HyperLogLog: 可以删除指定的 HyperLogLog。
     * <BR/>addElement 方法将一个元素添加到指定的 HyperLogLog 中。
     * <BR/>estimateCardinality 方法返回指定 HyperLogLog 中不同元素的近似数量。
     * <BR/>mergeHyperLogLogs 方法将多个 HyperLogLog 合并到一个目标 HyperLogLog 中。
     * <BR/>deleteHyperLogLog 方法删除指定的 HyperLogLog。

     * 通过这些操作，你可以有效地管理和估算大规模数据集中的不同元素数量，而不需要存储整个数据集，从而节省内存空间。
     */
    public static <T> HyperLogLogOperations<String, T> getHyperLogLogOperations(){
        RedisTemplate<String, T> redisTemplate = RedisTemplateConfig.getRedisTemplate();
        return redisTemplate.opsForHyperLogLog();
    }


}
